package com.pid.activiti.service.impl;

import com.pid.activiti.domain.ActWorkflowFormData;
import com.pid.activiti.domain.dto.HistoryFormDataDTO;
import com.pid.activiti.domain.dto.HistoryDataDTO;
import com.pid.activiti.service.IActWorkflowFormDataService;
import com.pid.activiti.service.IFormHistoryDataService;
import io.micrometer.core.instrument.config.validate.Validated;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.ibatis.jdbc.Null;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 */
@Service
public class FormHistoryDataServiceImpl implements IFormHistoryDataService {
    @Autowired
    private IActWorkflowFormDataService actWorkflowFormDataService;



    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public List<HistoryDataDTO> historyDataShow(String businessKey) {
        List<HistoryDataDTO> returnHistoryFromDataDTOS=new ArrayList<>();  // 存放流程处理的历史数据列表
        List<ActWorkflowFormData> actWorkflowFormData = actWorkflowFormDataService.selectActWorkflowFormDataByBusinessKey(businessKey);
        // Stream是Java8提供的新功能，是对集合对象功能的增强。优点：能对集合对象进行各种非常便利、高效的聚合操作，与Lambda 表达式结合，也可以提高编程效率、简洁性和程序可读性。
        // java8中新增了一个对集合进行操作的类，可以通过集合的.stream()方法得到这个类
        // collect方法进行数据的收集，因为现在的数据都是流，需要收集转化为对象进行使用
        // 根据任务名分组  Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组
        // 双冒号 :: 作用  (引用静态方法) 类名：静态方法名  ActWorkflowFormData::getTaskNodeName  直接返回了taskNodeName
        // 根据taskNodeName对actWorkflowFormData中的数据进行分组
        Map<String, List<ActWorkflowFormData>> collect = actWorkflowFormData.stream().collect(Collectors.groupingBy(ActWorkflowFormData::getTaskNodeName));
        // entrySet是Map数据类型的遍历方法，  Map.entry里面包含getKey和getValue方法  来获取Map中存放的键值对
        for (Map.Entry<String, List<ActWorkflowFormData>> entry : collect.entrySet()) {
            List<HistoryFormDataDTO> temp_list = new ArrayList<>();
            int index = 0;
            for (int i =0; i<entry.getValue().size(); i++){
                HistoryFormDataDTO historyFormDataDTO = new HistoryFormDataDTO(entry.getValue().get(i).getControlName(), entry.getValue().get(i).getControlValue());
                temp_list.add(historyFormDataDTO);
                if (i % 2 == 1){
                    HistoryDataDTO returnHistoryFromDataDTO = new HistoryDataDTO();
                    returnHistoryFromDataDTO.setTaskNodeName(entry.getValue().get(i).getTaskNodeName());
                    returnHistoryFromDataDTO.setCreateName(entry.getValue().get(i).getCreateBy());
                    returnHistoryFromDataDTO.setCreatedDate(sdf.format(entry.getValue().get(i).getCreateTime()));
                    List<HistoryFormDataDTO> new_list = new ArrayList<>();
                    // java 对List数组进行操作会影响内存中存放的元素，因此对temp_list数组进行操作之前使用temp_list对象赋值的对象都会受到影响，只能新建一个数组，对temp_list中的元素取出进行重新封装。
                    new_list.add(temp_list.get(index));
                    new_list.add(temp_list.get(index+1));
                    returnHistoryFromDataDTO.setFormHistoryDataDTO(new_list);
                    index = index + 2;
                    returnHistoryFromDataDTOS.add(returnHistoryFromDataDTO);
                }
            }
        }
        // toList()：Collectors类的静态方法，并返回一个Collector接口对象，该对象用于将一组数据存储到列表中。
        List<HistoryDataDTO> collect1 = returnHistoryFromDataDTOS.stream().sorted((x, y) -> x.getCreatedDate().compareTo(y.getCreatedDate())).collect(Collectors.toList());

        return collect1;
    }



}
